#ifndef YCEXTENSIONEXTENSION_H
#define YCEXTENSIONEXTENSION_H
#include "extensiontype.h"
#include <QAction>
#include <QJsonValue>
#include <QObject>

QT_BEGIN_NAMESPACE
class QTimer;
QT_END_NAMESPACE

namespace yc {

class ExtensionManager;
class ExtensionView;

class YCEXTENSIONSHARED_EXPORT Extension : public QObject
{
    Q_OBJECT

public:
    Extension(ExtensionManager* ext_mgr, QWidget* container);
    ~Extension();

    // 获得管理器
    ExtensionManager* extensionManager() const { return ext_mgr_; }
    // 返回是否已经强制关闭
    bool hasForcedStop() const { return forced_stop_; }
    // 返回指定名称的动作
    virtual QAction* action(const QString& /*name*/) const { return nullptr; }
    // 返回扩展视图
    virtual ExtensionView* view() = 0;
    // 启动
    virtual bool start(const QString& args);
    // 请求停止(大多需要做一些清理工作，而且可能是异步的，所以需要先请求停止，停止后，发出已停止的信号)
    virtual void requestStop();
    // 停止(立即执行停止, 可用于强制退出)
    virtual void stop();
    // 保存状态
    virtual QJsonValue saveState() const;
    virtual void restoreState(const QJsonValue& state);
    // 取消停止
    void cancelStop();
    // 停止停止倒计时
    void stopStopTimer();
    // 继续停止倒计时
    void restoreStopTimer();

Q_SIGNALS:
    void stopRequested(bool forced);
    void aboutToStop();
    void stopped();
    void stopIgnored();

private:
    Q_DISABLE_COPY_MOVE(Extension)

    void internalStop(bool forced_stop, int delay = 0);

    ExtensionManager* ext_mgr_;
    bool forced_stop_;
    int stop_delay_;
    bool stopping_;
    QTimer* stop_timer_;
};

} // namespace yc

#endif // YCEXTENSION_EXTENSION_H
